﻿#region Copyright (c) 2010 R. Uittenbosch
/*
* Copyright (C) 2010 R. Uittenbosch
* 
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and 
* associated documentation files (the "Software"), to deal in the Software without restriction, including 
* without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 
* copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the 
* following conditions:
* 
* The above copyright notice and this permission notice shall be included in all copies or substantial 
* portions of the Software.
* 
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT 
* LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO 
* EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 
* USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#endregion

using System;
using System.Linq;
using System.Collections.Generic;
using System.Text;
using System.Mobile.Mvc;
using Microsoft.Practices.Mobile.ContainerModel;
using TouchUI.System.Mobile.Mvc;
using LinkedService.Mobile.ServiceEntities;
using LinkedService.Mobile.Utility;


namespace LinkedIn.Mobile
{

  /// <summary>
  /// Controller for the mainprofile page.
  /// </summary>
  public class ProfileController : Controller<Person>
  {
    // Event to be handled by IView
    [PublishEvent("OnProfileLoaded")]
    public event EventHandler ProfileLoaded;

    private Person _person;

    public ProfileController(IView<Person> view)
      : base(view)
    {

    }

    public Container Container  { get; set; }

    /// <summary>
    /// This method indicates that something has been changed in the view.
    /// </summary>
    /// <param name="key">The string key to identify what has been changed.</param>
    protected override void OnViewStateChanged(string key)
    {

    }


    // Selected event from the view
    private void OnBack(object sender, EventArgs e)
    {
      // Move back to the search form
      NavigatorService.Navigator.GoBack();
    }

    protected override void OnInitialize(params object[] parameters)
    {      
      
      _person = this.GetFirstParameter<Person>(parameters);
      // Did we want a specific user to be visible?
      // Get the full profile for the given person in case we are close enhough
      // Otherwise get the simpel profile.
      if (_person != null)
      {
        // Close enough  or If ourselves
        if (_person.Distance > 0 || ApplicationManager.Configuration.GetItem<string>("CurrentUser") == _person.Id)
          this.view.ViewData.Model = ApplicationManager.Service.GetProfileByMemberIdF(_person.Id);
        else
        {
          // Get minimal profile
          this.view.ViewData.Model = ApplicationManager.Service.GetProfileByMemberIdM(_person.Id);
          if (!ApplicationManager.Service.Succesfull)
            ApplicationManager.NavigateToErrorHandling();
          else if (this.view.ViewData.Model.Distance > 0) // Close enough?
            this.view.ViewData.Model = ApplicationManager.Service.GetProfileByMemberIdF(_person.Id);
          else // Otherwise get the most we can get.
            this.view.ViewData.Model = ApplicationManager.Service.GetProfileByMemberId(_person.Id);

        }
      }
      else
        // Just give the full profile of the current user
        this.view.ViewData.Model = ApplicationManager.Service.GetCurrentUserF();
      // Init Model
      if (!ApplicationManager.Service.Succesfull)
        ApplicationManager.NavigateToErrorHandling();
      else
      {
        // Remember apirequest
        if (_person != null && 
            _person.ApiStandardProfileRequest != null && 
             this.view.ViewData.Model.ApiStandardProfileRequest == null)
          this.view.ViewData.Model.ApiStandardProfileRequest = _person.ApiStandardProfileRequest;

        // Remember the user
        ApplicationManager.LastPerson = this.view.ViewData.Model;
        // Notify the view
        if (this.ProfileLoaded != null)
          this.ProfileLoaded(this, EventArgs.Empty);
      }
    }
  }
}
